home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Prog / H-K / Inside Mac DA 2.4.cpt / IM Source / Search.Asm < prev    next >
Assembly Source File  |  1986-09-27  |  4KB  |  113 lines

  1. ; procedure Search(searchStr: Ptr; list: Ptr; var i: Integer;
  2. ;
  3. ; Diese Routine sucht das erste Auftreten eines Suchstrings in einer
  4. ; Liste. Sie geht davon aus, daß beim ersten Aufrufen von Search der
  5. ; Suchstring aus einem einzigen Zeichen besteht, beim nächsten aus zwei usw.
  6. ; Dies ist für alle solche Fälle praktisch, wo der User eine Eingabe über
  7. ; die Tastatur macht und das Programm sich in einer Liste von Strings 
  8. ; gewissermaßen "vorwärtshangeln" soll, genau wie beim SFGetFile-Dialog.
  9. ; SearchStr ist ein Pointer auf den zu suchenden String, list ein Pointer
  10. ; auf die Liste. Das Format dieser Liste ist gleich dem Format der STR#-
  11. ; Resourcen; außerdem muß sie alphabetisch aufsteigend sortiert sein.
  12. ; I ist der Index, ab der die Suche in der Liste beginnt; nach Rückkehr
  13. ; von der Routine enthält i den Index des gefundenen Strings in der Liste.
  14. ; Beim ersten Aufruf von Search muß i = 0 oder = 1 sein.
  15. ;
  16. ;    Version 1.0, 04.09.1986
  17. ;    Version 1.1, 27.09.1986        Längen-Bug korrigiert
  18. ;
  19. ;    Autor: Arne Schirmacher, Gutenbergstraße 14, 6070 Langen
  20.  
  21.  
  22.     xdef        search
  23. search
  24.     link        A6,#0    
  25.     movem.l        A0/A3/A4/D0/D1/D5/D6/D7,-(SP)                 
  26.     move.l        16(A6),A3    ; A3: Ptr auf searchString
  27.     move.l        12(A6),A4    ; A4: Ptr auf Liste
  28.     move.w        (A4),D5        ; D5: # Items in Liste
  29.     clr.w        D6
  30.     move.b        (A3),D6        ; D6: Länge searchString
  31.     movea.l        8(A6),A0
  32.     move.w        (A0),D7        ; D7: Index in Liste
  33.     tst.w        D7        ; falls Index = 0:
  34.     bne.s        L7        ; Index := 1
  35.     move.w        #1,D7
  36.     
  37. ; Eintrag in Liste finden, ab dem Vergleich durchgeführt werden soll
  38.  
  39. L7    sub.w        D7,D5        ; Anzahl restlicher Strings berechnen
  40.     bmi.s        L6        ; falls Ende erreicht, abbrechen
  41.     move.w        D7,D0        ; Index nach D0
  42.     subq.w        #1,D0        ; für DBRA 1 abziehen
  43.     clr.w        D1
  44.     lea        2(A4),A0    ; Ptr auf 1. String in Liste
  45.     move.b        (A0),D1        ; Längenbyte
  46.     bra.s        L1
  47. L2    move.b        (A0)+,D1    ; Längenbyte
  48.     lea        (A0,D1.w),A0    ; Adresse nächsten Strings
  49. L1    dbra        D0,L2
  50.     move.b        (A0),D1        ; Längenbyte (Korrektur Bug #1)
  51.  
  52. ; letztes Zeichen in searchString in Liste suchen. Abbruch wenn Zeichen
  53. ; in Liste größer oder gleich Zeichen in searchString oder wenn Listenende
  54. ; erreicht oder wenn SuchString länger als String in Liste ist
  55.  
  56.     move.b        (A3,D6.w),D0    ; zu suchendes Zeichen
  57.     cmp.b        #'z',D0        ; ist es Sonderzeichen?
  58.     bhi.s        L6        ; ja, abbrechen
  59.     cmp.b        #'Z',D0        ; Groß/Kleinschreibung ignorieren
  60.     bls.s        L3
  61.     sub.b        #$20,D0
  62.     bra.s        L3
  63. L4    subq.w        #1,D5        ; Anzahl restliche Strings
  64.     bmi.s        L6        ; falls Ende erreicht, abbrechen
  65.     addq.w        #1,D7        ; Index erhöhen
  66.     move.b        (A0)+,D1    ; Längenbyte
  67.     lea        (A0,D1.w),A0    ; Adresse nächsten Strings
  68.     move.b        (A0),D1        ; Längenbyte (Korrektur Bug #1)
  69. L3    cmp.b        D1,D6        ; Falls SuchString länger als
  70.     bhi.s        L4        ; String in Liste, nächsten String
  71.     move.b        (A0,D6.w),D1
  72.     cmp.b        #'Z',D1        ; Groß/Kleinschreibung ignorieren
  73.     bls.s        L8
  74.     sub.b        #$20,D1
  75. L8    cmp.b        D1,D0        ; mit Zeichen in Liste vergleichen
  76.     bhi.s        L4        ; Wenn Zeichen in Liste kleiner ist,
  77.                     ; weitersuchen
  78.     beq.s        L5
  79. L6    clr.w        D7        ; nicht gefunden: Index = 0
  80.  
  81.  
  82. ; Abschließender Test, ob der gefundene String wirklich identisch mit
  83. ; dem Suchstring ist
  84.  
  85. L5    tst.w        D7
  86.     beq.s        L9
  87.     clr.w        D0
  88.     move.b        (A3)+,D0    ; Längenbyte des searchStrings
  89.     subq.b        #1,D0        ; wegen dbra
  90.     addq.l        #1,A0        ; A0: Ptr auf Listen, ebenfalls Längenbyte überspringen
  91. L12    move.b        (A3)+,D1
  92.     move.b        (A0)+,D2
  93.     cmp.b        #'Z',D1        ; Groß/Kleinschreibung ignorieren
  94.     bls.s        L10
  95.     sub.b        #$20,D1
  96. L10    cmp.b        #'Z',D2        ; Groß/Kleinschreibung ignorieren
  97.     bls.s        L11
  98.     sub.b        #$20,D2
  99. L11    cmp.b        D1,D2
  100.     bne.s        L6
  101.     dbra        D0,L12
  102.  
  103. L9    movea.l        8(A6),A0    ; Index in VAR-Variable
  104.     move.w        D7,(A0)        ; eintragen
  105.  
  106.     
  107.     movem.l        (SP)+,A0/A3/A4/D0/D1/D5/D6/D7
  108.     unlk        A6
  109.     movea.l        (SP)+,A0
  110.     adda.l        #12,SP
  111.     jmp        (A0)
  112.     dc.w        'SEARCH  '
  113.